package cn.edu.xust.health.service;

import cn.edu.xust.health.entity.User;
import cn.hutool.jwt.JWT;
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Log
@Service
public class TokenService {

    // 使用表达式指定配置文件中的 key
    @Value("${xust.jwt.secret}")
    private String secret;

    /**
     * 以用户id、email、nickname为载荷(payload)生成 JWT
     * @param user 表示载荷(payload)中所包含的用户信息
     * @return
     */
    public String produce(User user) {
        log.info("secret = " + secret);
        byte[] key = secret.getBytes();
        // HS256(HmacSHA256)算法
        String token = JWT.create()
                .setPayload("id", String.valueOf(user.getId()) )
                .setPayload("email", user.getEmail() )
                .setPayload("nickname", user.getNickname())
                .setKey(key)
                .sign();
        return token;
    }

    /**
     * 对 JSON Web Token 进行校验
     * @param token 被校验的 TOKEN
     * @return 当校验通过时返回 true
     */
    public boolean verify(String token) {
        try {
            JWT jwt = JWT.of(token);
            jwt.setKey(secret.getBytes());
            return jwt.verify();
        } catch (Exception e) {
            log.warning( e.getMessage() );
            return false;
        }
    }

    /**
     * 解析 JSON Web Token 并从其中获取 payload
     * @param token 被解析的 JSON Web Token
     * @return 返回 由 payload 填充的 User 对象
     */
    public User parse(String token) {
        try {
            JWT jwt = JWT.of(token);
            Long id = Long.valueOf("" + jwt.getPayload("id"));
            String email = "" + jwt.getPayload("email");
            String nickname = String.valueOf(jwt.getPayload("nickname"));
            User user = new User();
            user.setId(id);
            user.setEmail(email);
            user.setNickname(nickname);
            return user;
        } catch (Exception e) {
            log.warning( e.getMessage() );
            return null;
        }
    }

}
